﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Twodi.Utility;

namespace Twodi.Structs
{
    /// <summary>
    /// Modelo para controle de tempo.
    /// </summary>
    public class Timer : IUpdateable, IGameComponent
    {
        /// <summary>
        /// Tempo atual do contador.
        /// </summary>
        private TimeSpan time;

        /// <summary>
        /// Animação está ativa.
        /// </summary>
        private bool enabled = true;

        /// <summary>
        /// Ordem de update da animação.
        /// </summary>
        private int updateOrder;

        /// <summary>
        /// Inicializar contador.
        /// </summary>
        public virtual void Initialize()
        {

        }

        /// <summary>
        /// Atualizar contador, calculando tempo atual.
        /// </summary>
        /// <param name="gameTime"></param>
        public virtual void Update(GameTime gameTime)
        {
            if (!Enabled) return;

            this.Time += gameTime.ElapsedGameTime;
        }

        /// <summary>
        /// Tempo atual do contador.
        /// </summary>
        public TimeSpan Time
        {
            get { return time; }
            set
            {
                time = value;
                onTimeChangedChanged(EventArgs.Empty);
            }
        }

        /// <summary>
        /// Animação está ativa.
        /// </summary>
        public bool Enabled
        {
            get
            {
                return this.enabled;
            }
            set
            {
                this.enabled = value;
                onEnabledChanged(EventArgs.Empty);
            }
        }

        /// <summary>
        /// Ordem de update da animação.
        /// </summary>
        public int UpdateOrder
        {
            get
            {
                return this.updateOrder;
            }
            set
            {
                this.updateOrder = value;
                onUpdateOrderChanged(EventArgs.Empty);
            }
        }

        /// <summary>
        /// Evento invocado quando tempo do contador é alterada.
        /// </summary>
        public event EventHandler<EventArgs> TimeChanged;

        /// <summary>
        /// Evento invocado quando ordem de update da animação é alterada.
        /// </summary>
        public event EventHandler<EventArgs> UpdateOrderChanged;

        /// <summary>
        /// Evento invocado quando status de ativo da animação é alterada.
        /// </summary>
        public event EventHandler<EventArgs> EnabledChanged;

        protected virtual void onTimeChangedChanged(EventArgs e)
        {
            if (TimeChanged != null)
            {
                TimeChanged(this, e);
            }
        }

        protected virtual void onUpdateOrderChanged(EventArgs e)
        {
            if (UpdateOrderChanged != null)
            {
                //Do something with FinishedChanged...
                UpdateOrderChanged(this, e);
            }
        }

        protected virtual void onEnabledChanged(EventArgs e)
        {
            if (EnabledChanged != null)
            {
                //Do something with FinishedChanged...
                EnabledChanged(this, e);
            }
        }
    }
}
